@webex/internal-plugin-locus 3.0.0-beta.2 → 3.0.0-beta.21

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.
package/dist/locus.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["USE_INCOMING","USE_CURRENT","EQUAL","FETCH","GREATER_THAN","LESS_THAN","DESYNC","compareToAction","result","Error","Locus","WebexPlugin","extend","namespace","alert","locus","request","method","uri","url","body","deviceUrl","webex","internal","device","sequence","then","res","compare","current","incoming","isEmpty","entries","length","rangeStart","rangeEnd","baseSequence","compareDelta","compareSequence","ret","getEntriesFirstValue","getEntriesLastValue","getCompareFirstValue","getCompareLastValue","inRange","entry","currentOnlyEntries","incomingOnlyEntries","currentOnly","incomingOnly","i","push","create","invitee","options","correlationId","service","resource","localMedias","localSdp","type","sdp","self","devices","map","item","index","mediaConnections","createOrJoin","target","join","decline","catch","reason","WebexHttpError","Conflict","get","reject","getCallHistory","from","Date","toISOString","qs","leave","list","loci","merge","next","forEach","key","participants","toRemove","toUpsert","p","removed","add","set","reduce","acc","has","value","releaseFloorGrant","share","floor","disposition","requestFloorGrant","beneficiary","sendDtmf","tones","dtmf","uuid","v4","sync","syncUrl","updateMedia","audioMuted","videoMuted","mediaId"],"sources":["locus.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin, WebexHttpError} from '@webex/webex-core';\nimport {cloneDeep, difference, first, last, memoize} from 'lodash';\nimport uuid from 'uuid';\n\nexport const USE_INCOMING = 'USE_INCOMING';\nexport const USE_CURRENT = 'USE_CURRENT';\nexport const EQUAL = 'EQUAL';\nexport const FETCH = 'FETCH';\nexport const GREATER_THAN = 'GREATER_THAN';\nexport const LESS_THAN = 'LESS_THAN';\nexport const DESYNC = 'DESYNC';\n\n/**\n * Transates the result of a sequence comparison into an intended behavior\n * @param {string} result\n * @private\n * @returns {string}\n */\nfunction compareToAction(result) {\n switch (result) {\n case EQUAL:\n case GREATER_THAN:\n return USE_CURRENT;\n case LESS_THAN:\n return USE_INCOMING;\n case DESYNC:\n return FETCH;\n default:\n throw new Error(`${result} is not a recognized sequence comparison result`);\n }\n}\n\n/**\n * @class\n */\nconst Locus = WebexPlugin.extend({\n namespace: 'Locus',\n\n /**\n * Alert the specified locus that the local user has been notified of the\n * locus's active state\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Promise}\n */\n alert(locus) {\n return this.request({\n method: 'PUT',\n uri: `${locus.url}/participant/alert`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n sequence: locus.sequence\n }\n })\n .then((res) => res.body);\n },\n\n\n /**\n * Compares two loci to determine which one contains the most recent state\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} one of USE_INCOMING, USE_CURRENT, or FETCH\n */\n compare(current, incoming) {\n /**\n * Determines if a paricular locus's sequence is empty\n * @param {Types~Locus} locus\n * @private\n * @returns {bool}\n */\n function isEmpty(locus) {\n const {sequence} = locus;\n\n return (!sequence.entries || !sequence.entries.length) && sequence.rangeStart === 0 && sequence.rangeEnd === 0;\n }\n\n if (isEmpty(current) || isEmpty(incoming)) {\n return USE_INCOMING;\n }\n\n if (incoming.baseSequence) {\n return this.compareDelta(current, incoming);\n }\n\n return compareToAction(this.compareSequence(current.sequence, incoming.sequence));\n },\n\n /**\n * Compares two loci sequences (with delta params) and indicates what action\n * to take.\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @private\n * @returns {string} one of USE_INCOMING, USE_CURRENT, or FETCH\n */\n compareDelta(current, incoming) {\n let ret = this.compareSequence(current.sequence, incoming.sequence);\n\n if (ret !== LESS_THAN) {\n return compareToAction(ret);\n }\n\n ret = this.compareSequence(current.sequence, incoming.baseSequence);\n\n switch (ret) {\n case GREATER_THAN:\n case EQUAL:\n return USE_INCOMING;\n default:\n return FETCH;\n }\n },\n\n /**\n * Compares two Locus sequences\n * @instance\n * @memberof Locus\n * @param {LocusSequence} current\n * @param {LocusSequence} incoming\n * @returns {string} one of LESS_THAN, GREATER_THAN, EQUAL, or DESYNC\n */\n compareSequence(current, incoming) {\n if (!current) {\n throw new Error('`current` is required');\n }\n\n if (!incoming) {\n throw new Error('`incoming` is required');\n }\n // complexity here is unavoidable\n /* eslint complexity: [0] */\n /* eslint max-statements: [0] */\n\n // must pick one of arrow-body-style or no-confusing-arrow to disable\n /* eslint arrow-body-style: [0] */\n\n // after running the #compare() test suite in a loop, there doesn't seem to\n // be any appreciable difference when used with or without memoize; since\n // real locus sequences are likely to contain more sequence numbers than\n // those in the test suite, I have to assume memoize can only help and the\n // overhead of memoizing these methods is not a problem.\n\n const getEntriesFirstValue = memoize((sequence) => {\n return sequence.entries.length === 0 ? 0 : first(sequence.entries);\n });\n const getEntriesLastValue = memoize((sequence) => {\n return sequence.entries.length === 0 ? 0 : last(sequence.entries);\n });\n const getCompareFirstValue = memoize((sequence) => {\n return sequence.rangeStart || getEntriesFirstValue(sequence);\n });\n const getCompareLastValue = memoize((sequence) => {\n return getEntriesLastValue(sequence) || sequence.rangeEnd;\n });\n\n /**\n * @param {number} entry\n * @param {LocusSequence} sequence\n * @private\n * @returns {Boolean}\n */\n function inRange(entry, sequence) {\n return entry >= sequence.rangeStart && entry <= sequence.rangeEnd;\n }\n\n if (getCompareFirstValue(current) > getCompareLastValue(incoming)) {\n return GREATER_THAN;\n }\n\n if (getCompareLastValue(current) < getCompareFirstValue(incoming)) {\n return LESS_THAN;\n }\n\n const currentOnlyEntries = difference(current.entries, incoming.entries);\n const incomingOnlyEntries = difference(incoming.entries, current.entries);\n const currentOnly = [];\n const incomingOnly = [];\n\n for (const i of currentOnlyEntries) {\n if (!inRange(i, incoming)) {\n currentOnly.push(i);\n }\n }\n for (const i of incomingOnlyEntries) {\n if (!inRange(i, current)) {\n incomingOnly.push(i);\n }\n }\n\n if (!currentOnly.length && !incomingOnly.length) {\n if (current.rangeEnd - getCompareFirstValue(current) > incoming.rangeEnd - getCompareFirstValue(incoming)) {\n return GREATER_THAN;\n }\n\n if (current.rangeEnd - getCompareFirstValue(current) < incoming.rangeEnd - getCompareFirstValue(incoming)) {\n return LESS_THAN;\n }\n\n return EQUAL;\n }\n\n if (currentOnly.length && !incomingOnly.length) {\n return GREATER_THAN;\n }\n\n if (!currentOnly.length && incomingOnly.length) {\n return LESS_THAN;\n }\n\n if (!current.rangeStart && !current.rangeEnd && !incoming.rangeStart && !incoming.rangeEnd) {\n return DESYNC;\n }\n\n for (const i of currentOnly) {\n if (getCompareFirstValue(incoming) < i && i < getCompareLastValue(incoming)) {\n return DESYNC;\n }\n }\n\n for (const i of incomingOnly) {\n if (getCompareFirstValue(current) < i && i < getCompareLastValue(current)) {\n return DESYNC;\n }\n }\n\n if (currentOnly[0] > incomingOnly[0]) {\n return GREATER_THAN;\n }\n\n return LESS_THAN;\n },\n\n /**\n * Calls the specified invitee and offers the specified media via\n * options.localSdp\n * @instance\n * @memberof Locus\n * @param {string} invitee\n * @param {Object} options\n * @param {Object} options.localSdp\n * @returns {Promise<Types~Locus>}\n */\n create(invitee, options = {}) {\n const {correlationId} = options;\n\n if (!correlationId) {\n throw new Error('options.correlationId is required');\n }\n\n return this.request({\n method: 'POST',\n service: 'locus',\n resource: 'loci/call',\n body: {\n correlationId,\n deviceUrl: this.webex.internal.device.url,\n invitee: {\n invitee\n },\n localMedias: [{\n localSdp: JSON.stringify({\n type: 'SDP',\n sdp: options.localSdp\n })\n }],\n sequence: {\n entries: [],\n rangeStart: 0,\n rangeEnd: 0\n }\n }\n })\n // res.body.mediaConnections is deprecated so just return the locus\n .then((res) => {\n res.body.locus.self.devices.map((item, index) => {\n item.mediaConnections = [res.body.mediaConnections[index]];\n\n return item;\n });\n\n return res.body.locus;\n });\n },\n\n /**\n * This is mostly an internal function to simplify the phone plugin. Decides\n * which path to call based on the type of the thing being joined.\n * @instance\n * @memberof Locus\n * @param {Object|Types~Locus} target\n * @param {Object} options\n * @private\n * @returns {Promise<Types~Locus>}\n */\n createOrJoin(target, options) {\n if (target.url) {\n return this.join(target, options);\n }\n\n return this.create(target, options);\n },\n\n /**\n * Decline to join the specified Locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Promise<Types~Locus>}\n */\n decline(locus) {\n return this.request({\n method: 'PUT',\n uri: `${locus.url}/participant/decline`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n sequence: locus.sequence\n }\n })\n .then((res) => res.body)\n .catch((reason) => {\n if (reason instanceof WebexHttpError.Conflict) {\n return this.get(locus);\n }\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Retrieves a single Locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Types~Locus}\n */\n get(locus) {\n return this.request({\n method: 'GET',\n uri: `${locus.url}`\n })\n .then((res) => res.body);\n },\n\n /**\n * Retrieves the call history for the current user\n * @instance\n * @memberof Locus\n * @param {Object} options\n * @param {Date|number} options.from\n * @returns {Promise<Object>}\n */\n getCallHistory(options = {}) {\n const from = (new Date(options.from || Date.now())).toISOString();\n\n return this.request({\n method: 'GET',\n service: 'janus',\n resource: 'history/userSessions',\n qs: {from}\n })\n .then((res) => res.body);\n },\n\n /**\n * Join the specified Locus and offer to send it media\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @param {Object} options\n * @param {Object} options.localSdp\n * @returns {Types~Locus}\n */\n join(locus, options = {}) {\n const correlationId = locus.correlationId || options.correlationId;\n\n if (!correlationId) {\n throw new Error('locus.correlationId or options.correlationId is required');\n }\n\n return this.request({\n method: 'POST',\n uri: `${locus.url}/participant`,\n body: {\n correlationId,\n deviceUrl: this.webex.internal.device.url,\n localMedias: [{\n localSdp: JSON.stringify({\n type: 'SDP',\n sdp: options.localSdp\n })\n }],\n sequence: locus.sequence || {\n entries: [],\n rangeStart: 0,\n rangeEnd: 0\n }\n }\n })\n // The mediaConnections object is deprecated, so just return the locus\n .then((res) => {\n res.body.locus.self.devices.map((item, index) => {\n item.mediaConnections = [res.body.mediaConnections[index]];\n\n return item;\n });\n\n return res.body.locus;\n });\n },\n\n /**\n * Leave the specified Locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Promise<Types~Locus>}\n */\n leave(locus) {\n return this.request({\n method: 'PUT',\n uri: `${locus.self.url}/leave`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n sequence: locus.sequence\n }\n })\n .then((res) => res.body.locus)\n .catch((reason) => {\n if (reason instanceof WebexHttpError.Conflict) {\n return this.get(locus);\n }\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Lists active loci\n * @instance\n * @memberof Locus\n * @returns {Promise<Array<Types~Locus>>}\n */\n list() {\n return this.request({\n method: 'GET',\n service: 'locus',\n resource: 'loci'\n })\n .then((res) => res.body.loci);\n },\n\n /**\n * Merges two locus DTOs (for the same locus)\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus|Types~LocusDelta} incoming\n * @returns {Type~Locus}\n */\n merge(current, incoming) {\n // if incoming is not a delta event, treat it as a new full locus.\n if (!incoming.baseSequence) {\n return incoming;\n }\n\n const next = cloneDeep(current);\n\n // 1. All non-null elements in the delta event except the \"baseSequence\" and\n // the \"participants\" collection should be used to replace their existing\n // values.\n Object.keys(incoming).forEach((key) => {\n if (key === 'baseSequence' || key === 'participants') {\n return;\n }\n\n next[key] = incoming[key] || next[key];\n });\n\n // 2. The \"baseSequence\" in the delta event can be discarded (it doesn't\n // need to be maintained in the local working copy).\n\n if (incoming.participants || incoming.participants.length) {\n const toRemove = new Set();\n const toUpsert = new Map();\n\n incoming.participants.forEach((p) => {\n if (p.removed) {\n // Elements of the delta event's \"participants\" list with the\n // attribute `removed=true` should be removed from the working copy's\n // \"participants\" collection.\n toRemove.add(p.url);\n }\n else {\n // Elements of the delta events \"participants\" list that are absent\n // from the local working copy should be added to that collection.\n toUpsert.set(p.url, p);\n }\n });\n\n // The \"participants\" collection in the delta event should be merged with\n // that of the local working copy of the Locus such that elements in the\n // delta event's \"participants\" replace those with the same url value in\n // the working copy \"participants\" collection.\n const participants = next.participants.reduce((acc, p) => {\n if (!toRemove.has(p.url)) {\n acc[p.url] = p;\n }\n\n return acc;\n }, {});\n\n toUpsert.forEach((value, key) => {\n participants[key] = value;\n });\n\n next.participants = Object.values(participants);\n }\n\n return next;\n },\n\n /**\n * Signals to locus that the current user is done sharing their additional\n * media stream\n * @param {Types~Locus} locus\n * @param {Types~MediaShare} share\n * @returns {Promise}\n */\n releaseFloorGrant(locus, share) {\n return this.webex.request({\n uri: share.url,\n method: 'PUT',\n body: {\n floor: {\n disposition: 'RELEASED'\n }\n }\n })\n .then(({body}) => body);\n },\n\n /**\n * Signals to locus that the current user would like to share an additional\n * media stream\n * @param {Types~Locus} locus\n * @param {Types~MediaShare} share\n * @returns {Promise}\n */\n requestFloorGrant(locus, share) {\n return this.webex.request({\n uri: share.url,\n method: 'PUT',\n body: {\n floor: {\n beneficiary: {\n url: locus.self.url,\n devices: [{url: this.webex.internal.device.url}]\n },\n disposition: 'GRANTED'\n }\n }\n })\n .then(({body}) => body);\n },\n\n /**\n * Sends a string of DTMF tones to the locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @param {string} tones\n * @returns {Promise}\n */\n sendDtmf(locus, tones) {\n return this.request({\n method: 'POST',\n uri: `${locus.self.url}/sendDtmf`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n dtmf: {\n correlationId: uuid.v4(),\n tones\n }\n }\n });\n },\n\n /**\n * Fetches the delta for the locus from its syncUrl. *Does not merge*\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Types~LocusDelta}\n */\n sync(locus) {\n return this.request({\n method: 'GET',\n uri: locus.syncUrl\n })\n // the api may return a 204 no content, so we'll give back an empty\n // object in that case.\n .then((res) => res.body || {});\n },\n\n /**\n * Send a new sdp to Linus via the Locus API to update media state (e.g. to\n * start or stop sending audio or video)\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @param {Object} options\n * @param {string} options.localSdp\n * @param {string} options.mediaId\n * @param {Boolean} options.audioMuted\n * @param {Boolean} options.videoMuted\n * @returns {Promise<Types~Locus>}\n */\n updateMedia(locus, {\n sdp, audioMuted, videoMuted, mediaId\n }) {\n const localSdp = {\n audioMuted,\n videoMuted\n };\n\n if (sdp) {\n localSdp.type = 'SDP';\n localSdp.sdp = sdp;\n }\n\n return this.request({\n method: 'PUT',\n uri: `${locus.self.url}/media`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n localMedias: [{\n localSdp: JSON.stringify(localSdp),\n mediaId\n }],\n sequence: locus.sequence\n }\n })\n .then((res) => res.body.locus);\n }\n});\n\nexport default Locus;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AAEA;;;;;;;;AAEO,IAAMA,YAAY,GAAG,cAArB;;AACA,IAAMC,WAAW,GAAG,aAApB;;AACA,IAAMC,KAAK,GAAG,OAAd;;AACA,IAAMC,KAAK,GAAG,OAAd;;AACA,IAAMC,YAAY,GAAG,cAArB;;AACA,IAAMC,SAAS,GAAG,WAAlB;;AACA,IAAMC,MAAM,GAAG,QAAf;AAEP;AACA;AACA;AACA;AACA;AACA;;;;AACA,SAASC,eAAT,CAAyBC,MAAzB,EAAiC;EAC/B,QAAQA,MAAR;IACE,KAAKN,KAAL;IACA,KAAKE,YAAL;MACE,OAAOH,WAAP;;IACF,KAAKI,SAAL;MACE,OAAOL,YAAP;;IACF,KAAKM,MAAL;MACE,OAAOH,KAAP;;IACF;MACE,MAAM,IAAIM,KAAJ,WAAaD,MAAb,qDAAN;EATJ;AAWD;AAED;AACA;AACA;;;AACA,IAAME,KAAK,GAAGC,sBAAA,CAAYC,MAAZ,CAAmB;EAC/BC,SAAS,EAAE,OADoB;;EAG/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,KAX+B,iBAWzBC,KAXyB,EAWlB;IACX,OAAO,KAAKC,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBC,GAAG,YAAKH,KAAK,CAACI,GAAX,uBAFe;MAGlBC,IAAI,EAAE;QACJC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GADlC;QAEJM,QAAQ,EAAEV,KAAK,CAACU;MAFZ;IAHY,CAAb,EAQJC,IARI,CAQC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAb;IAAA,CARD,CAAP;EASD,CArB8B;;EAwB/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEQ,OAhC+B,mBAgCvBC,OAhCuB,EAgCdC,QAhCc,EAgCJ;IACzB;AACJ;AACA;AACA;AACA;AACA;IACI,SAASC,OAAT,CAAiBhB,KAAjB,EAAwB;MACtB,IAAOU,QAAP,GAAmBV,KAAnB,CAAOU,QAAP;MAEA,OAAO,CAAC,CAACA,QAAQ,CAACO,OAAV,IAAqB,CAACP,QAAQ,CAACO,OAAT,CAAiBC,MAAxC,KAAmDR,QAAQ,CAACS,UAAT,KAAwB,CAA3E,IAAgFT,QAAQ,CAACU,QAAT,KAAsB,CAA7G;IACD;;IAED,IAAIJ,OAAO,CAACF,OAAD,CAAP,IAAoBE,OAAO,CAACD,QAAD,CAA/B,EAA2C;MACzC,OAAO9B,YAAP;IACD;;IAED,IAAI8B,QAAQ,CAACM,YAAb,EAA2B;MACzB,OAAO,KAAKC,YAAL,CAAkBR,OAAlB,EAA2BC,QAA3B,CAAP;IACD;;IAED,OAAOvB,eAAe,CAAC,KAAK+B,eAAL,CAAqBT,OAAO,CAACJ,QAA7B,EAAuCK,QAAQ,CAACL,QAAhD,CAAD,CAAtB;EACD,CAtD8B;;EAwD/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEY,YAlE+B,wBAkElBR,OAlEkB,EAkETC,QAlES,EAkEC;IAC9B,IAAIS,GAAG,GAAG,KAAKD,eAAL,CAAqBT,OAAO,CAACJ,QAA7B,EAAuCK,QAAQ,CAACL,QAAhD,CAAV;;IAEA,IAAIc,GAAG,KAAKlC,SAAZ,EAAuB;MACrB,OAAOE,eAAe,CAACgC,GAAD,CAAtB;IACD;;IAEDA,GAAG,GAAG,KAAKD,eAAL,CAAqBT,OAAO,CAACJ,QAA7B,EAAuCK,QAAQ,CAACM,YAAhD,CAAN;;IAEA,QAAQG,GAAR;MACE,KAAKnC,YAAL;MACA,KAAKF,KAAL;QACE,OAAOF,YAAP;;MACF;QACE,OAAOG,KAAP;IALJ;EAOD,CAlF8B;;EAoF/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEmC,eA5F+B,2BA4FfT,OA5Fe,EA4FNC,QA5FM,EA4FI;IACjC,IAAI,CAACD,OAAL,EAAc;MACZ,MAAM,IAAIpB,KAAJ,CAAU,uBAAV,CAAN;IACD;;IAED,IAAI,CAACqB,QAAL,EAAe;MACb,MAAM,IAAIrB,KAAJ,CAAU,wBAAV,CAAN;IACD,CAPgC,CAQjC;;IACA;;IACA;IAEA;;IACA;IAEA;IACA;IACA;IACA;IACA;;;IAEA,IAAM+B,oBAAoB,GAAG,uBAAQ,UAACf,QAAD,EAAc;MACjD,OAAOA,QAAQ,CAACO,OAAT,CAAiBC,MAAjB,KAA4B,CAA5B,GAAgC,CAAhC,GAAoC,qBAAMR,QAAQ,CAACO,OAAf,CAA3C;IACD,CAF4B,CAA7B;IAGA,IAAMS,mBAAmB,GAAG,uBAAQ,UAAChB,QAAD,EAAc;MAChD,OAAOA,QAAQ,CAACO,OAAT,CAAiBC,MAAjB,KAA4B,CAA5B,GAAgC,CAAhC,GAAoC,oBAAKR,QAAQ,CAACO,OAAd,CAA3C;IACD,CAF2B,CAA5B;IAGA,IAAMU,oBAAoB,GAAG,uBAAQ,UAACjB,QAAD,EAAc;MACjD,OAAOA,QAAQ,CAACS,UAAT,IAAuBM,oBAAoB,CAACf,QAAD,CAAlD;IACD,CAF4B,CAA7B;IAGA,IAAMkB,mBAAmB,GAAG,uBAAQ,UAAClB,QAAD,EAAc;MAChD,OAAOgB,mBAAmB,CAAChB,QAAD,CAAnB,IAAiCA,QAAQ,CAACU,QAAjD;IACD,CAF2B,CAA5B;IAIA;AACJ;AACA;AACA;AACA;AACA;;IACI,SAASS,OAAT,CAAiBC,KAAjB,EAAwBpB,QAAxB,EAAkC;MAChC,OAAOoB,KAAK,IAAIpB,QAAQ,CAACS,UAAlB,IAAgCW,KAAK,IAAIpB,QAAQ,CAACU,QAAzD;IACD;;IAED,IAAIO,oBAAoB,CAACb,OAAD,CAApB,GAAgCc,mBAAmB,CAACb,QAAD,CAAvD,EAAmE;MACjE,OAAO1B,YAAP;IACD;;IAED,IAAIuC,mBAAmB,CAACd,OAAD,CAAnB,GAA+Ba,oBAAoB,CAACZ,QAAD,CAAvD,EAAmE;MACjE,OAAOzB,SAAP;IACD;;IAED,IAAMyC,kBAAkB,GAAG,0BAAWjB,OAAO,CAACG,OAAnB,EAA4BF,QAAQ,CAACE,OAArC,CAA3B;IACA,IAAMe,mBAAmB,GAAG,0BAAWjB,QAAQ,CAACE,OAApB,EAA6BH,OAAO,CAACG,OAArC,CAA5B;IACA,IAAMgB,WAAW,GAAG,EAApB;IACA,IAAMC,YAAY,GAAG,EAArB;;IAvDiC,2CAyDjBH,kBAzDiB;IAAA;;IAAA;MAyDjC,oDAAoC;QAAA,IAAzBI,GAAyB;;QAClC,IAAI,CAACN,OAAO,CAACM,GAAD,EAAIpB,QAAJ,CAAZ,EAA2B;UACzBkB,WAAW,CAACG,IAAZ,CAAiBD,GAAjB;QACD;MACF;IA7DgC;MAAA;IAAA;MAAA;IAAA;;IAAA,4CA8DjBH,mBA9DiB;IAAA;;IAAA;MA8DjC,uDAAqC;QAAA,IAA1BG,GAA0B;;QACnC,IAAI,CAACN,OAAO,CAACM,GAAD,EAAIrB,OAAJ,CAAZ,EAA0B;UACxBoB,YAAY,CAACE,IAAb,CAAkBD,GAAlB;QACD;MACF;IAlEgC;MAAA;IAAA;MAAA;IAAA;;IAoEjC,IAAI,CAACF,WAAW,CAACf,MAAb,IAAuB,CAACgB,YAAY,CAAChB,MAAzC,EAAiD;MAC/C,IAAIJ,OAAO,CAACM,QAAR,GAAmBO,oBAAoB,CAACb,OAAD,CAAvC,GAAmDC,QAAQ,CAACK,QAAT,GAAoBO,oBAAoB,CAACZ,QAAD,CAA/F,EAA2G;QACzG,OAAO1B,YAAP;MACD;;MAED,IAAIyB,OAAO,CAACM,QAAR,GAAmBO,oBAAoB,CAACb,OAAD,CAAvC,GAAmDC,QAAQ,CAACK,QAAT,GAAoBO,oBAAoB,CAACZ,QAAD,CAA/F,EAA2G;QACzG,OAAOzB,SAAP;MACD;;MAED,OAAOH,KAAP;IACD;;IAED,IAAI8C,WAAW,CAACf,MAAZ,IAAsB,CAACgB,YAAY,CAAChB,MAAxC,EAAgD;MAC9C,OAAO7B,YAAP;IACD;;IAED,IAAI,CAAC4C,WAAW,CAACf,MAAb,IAAuBgB,YAAY,CAAChB,MAAxC,EAAgD;MAC9C,OAAO5B,SAAP;IACD;;IAED,IAAI,CAACwB,OAAO,CAACK,UAAT,IAAuB,CAACL,OAAO,CAACM,QAAhC,IAA4C,CAACL,QAAQ,CAACI,UAAtD,IAAoE,CAACJ,QAAQ,CAACK,QAAlF,EAA4F;MAC1F,OAAO7B,MAAP;IACD;;IAED,gCAAgB0C,WAAhB,kCAA6B;MAAxB,IAAME,CAAC,mBAAP;;MACH,IAAIR,oBAAoB,CAACZ,QAAD,CAApB,GAAiCoB,CAAjC,IAAsCA,CAAC,GAAGP,mBAAmB,CAACb,QAAD,CAAjE,EAA6E;QAC3E,OAAOxB,MAAP;MACD;IACF;;IAED,kCAAgB2C,YAAhB,qCAA8B;MAAzB,IAAMC,GAAC,qBAAP;;MACH,IAAIR,oBAAoB,CAACb,OAAD,CAApB,GAAgCqB,GAAhC,IAAqCA,GAAC,GAAGP,mBAAmB,CAACd,OAAD,CAAhE,EAA2E;QACzE,OAAOvB,MAAP;MACD;IACF;;IAED,IAAI0C,WAAW,CAAC,CAAD,CAAX,GAAiBC,YAAY,CAAC,CAAD,CAAjC,EAAsC;MACpC,OAAO7C,YAAP;IACD;;IAED,OAAOC,SAAP;EACD,CAzM8B;;EA2M/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE+C,MArN+B,kBAqNxBC,OArNwB,EAqND;IAAA,IAAdC,OAAc,uEAAJ,EAAI;IAC5B,IAAOC,aAAP,GAAwBD,OAAxB,CAAOC,aAAP;;IAEA,IAAI,CAACA,aAAL,EAAoB;MAClB,MAAM,IAAI9C,KAAJ,CAAU,mCAAV,CAAN;IACD;;IAED,OAAO,KAAKO,OAAL,CAAa;MAClBC,MAAM,EAAE,MADU;MAElBuC,OAAO,EAAE,OAFS;MAGlBC,QAAQ,EAAE,WAHQ;MAIlBrC,IAAI,EAAE;QACJmC,aAAa,EAAbA,aADI;QAEJlC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GAFlC;QAGJkC,OAAO,EAAE;UACPA,OAAO,EAAPA;QADO,CAHL;QAMJK,WAAW,EAAE,CAAC;UACZC,QAAQ,EAAE,wBAAe;YACvBC,IAAI,EAAE,KADiB;YAEvBC,GAAG,EAAEP,OAAO,CAACK;UAFU,CAAf;QADE,CAAD,CANT;QAYJlC,QAAQ,EAAE;UACRO,OAAO,EAAE,EADD;UAERE,UAAU,EAAE,CAFJ;UAGRC,QAAQ,EAAE;QAHF;MAZN;IAJY,CAAb,EAuBL;IAvBK,CAwBJT,IAxBI,CAwBC,UAACC,GAAD,EAAS;MACbA,GAAG,CAACP,IAAJ,CAASL,KAAT,CAAe+C,IAAf,CAAoBC,OAApB,CAA4BC,GAA5B,CAAgC,UAACC,IAAD,EAAOC,KAAP,EAAiB;QAC/CD,IAAI,CAACE,gBAAL,GAAwB,CAACxC,GAAG,CAACP,IAAJ,CAAS+C,gBAAT,CAA0BD,KAA1B,CAAD,CAAxB;QAEA,OAAOD,IAAP;MACD,CAJD;MAMA,OAAOtC,GAAG,CAACP,IAAJ,CAASL,KAAhB;IACD,CAhCI,CAAP;EAiCD,CA7P8B;;EA+P/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEqD,YAzQ+B,wBAyQlBC,MAzQkB,EAyQVf,OAzQU,EAyQD;IAC5B,IAAIe,MAAM,CAAClD,GAAX,EAAgB;MACd,OAAO,KAAKmD,IAAL,CAAUD,MAAV,EAAkBf,OAAlB,CAAP;IACD;;IAED,OAAO,KAAKF,MAAL,CAAYiB,MAAZ,EAAoBf,OAApB,CAAP;EACD,CA/Q8B;;EAiR/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEiB,OAxR+B,mBAwRvBxD,KAxRuB,EAwRhB;IAAA;;IACb,OAAO,KAAKC,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBC,GAAG,YAAKH,KAAK,CAACI,GAAX,yBAFe;MAGlBC,IAAI,EAAE;QACJC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GADlC;QAEJM,QAAQ,EAAEV,KAAK,CAACU;MAFZ;IAHY,CAAb,EAQJC,IARI,CAQC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAb;IAAA,CARD,EASJoD,KATI,CASE,UAACC,MAAD,EAAY;MACjB,IAAIA,MAAM,YAAYC,yBAAA,CAAeC,QAArC,EAA+C;QAC7C,OAAO,KAAI,CAACC,GAAL,CAAS7D,KAAT,CAAP;MACD;;MAED,OAAO,iBAAQ8D,MAAR,CAAeJ,MAAf,CAAP;IACD,CAfI,CAAP;EAgBD,CAzS8B;;EA2S/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,GAlT+B,eAkT3B7D,KAlT2B,EAkTpB;IACT,OAAO,KAAKC,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBC,GAAG,YAAKH,KAAK,CAACI,GAAX;IAFe,CAAb,EAIJO,IAJI,CAIC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAb;IAAA,CAJD,CAAP;EAKD,CAxT8B;;EA0T/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE0D,cAlU+B,4BAkUF;IAAA,IAAdxB,OAAc,uEAAJ,EAAI;IAC3B,IAAMyB,IAAI,GAAI,IAAIC,IAAJ,CAAS1B,OAAO,CAACyB,IAAR,IAAgB,mBAAzB,CAAD,CAAuCE,WAAvC,EAAb;IAEA,OAAO,KAAKjE,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBuC,OAAO,EAAE,OAFS;MAGlBC,QAAQ,EAAE,sBAHQ;MAIlByB,EAAE,EAAE;QAACH,IAAI,EAAJA;MAAD;IAJc,CAAb,EAMJrD,IANI,CAMC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAb;IAAA,CAND,CAAP;EAOD,CA5U8B;;EA8U/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEkD,IAvV+B,gBAuV1BvD,KAvV0B,EAuVL;IAAA,IAAduC,OAAc,uEAAJ,EAAI;IACxB,IAAMC,aAAa,GAAGxC,KAAK,CAACwC,aAAN,IAAuBD,OAAO,CAACC,aAArD;;IAEA,IAAI,CAACA,aAAL,EAAoB;MAClB,MAAM,IAAI9C,KAAJ,CAAU,0DAAV,CAAN;IACD;;IAED,OAAO,KAAKO,OAAL,CAAa;MAClBC,MAAM,EAAE,MADU;MAElBC,GAAG,YAAKH,KAAK,CAACI,GAAX,iBAFe;MAGlBC,IAAI,EAAE;QACJmC,aAAa,EAAbA,aADI;QAEJlC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GAFlC;QAGJuC,WAAW,EAAE,CAAC;UACZC,QAAQ,EAAE,wBAAe;YACvBC,IAAI,EAAE,KADiB;YAEvBC,GAAG,EAAEP,OAAO,CAACK;UAFU,CAAf;QADE,CAAD,CAHT;QASJlC,QAAQ,EAAEV,KAAK,CAACU,QAAN,IAAkB;UAC1BO,OAAO,EAAE,EADiB;UAE1BE,UAAU,EAAE,CAFc;UAG1BC,QAAQ,EAAE;QAHgB;MATxB;IAHY,CAAb,EAmBL;IAnBK,CAoBJT,IApBI,CAoBC,UAACC,GAAD,EAAS;MACbA,GAAG,CAACP,IAAJ,CAASL,KAAT,CAAe+C,IAAf,CAAoBC,OAApB,CAA4BC,GAA5B,CAAgC,UAACC,IAAD,EAAOC,KAAP,EAAiB;QAC/CD,IAAI,CAACE,gBAAL,GAAwB,CAACxC,GAAG,CAACP,IAAJ,CAAS+C,gBAAT,CAA0BD,KAA1B,CAAD,CAAxB;QAEA,OAAOD,IAAP;MACD,CAJD;MAMA,OAAOtC,GAAG,CAACP,IAAJ,CAASL,KAAhB;IACD,CA5BI,CAAP;EA6BD,CA3X8B;;EA6X/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEoE,KApY+B,iBAoYzBpE,KApYyB,EAoYlB;IAAA;;IACX,OAAO,KAAKC,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBC,GAAG,YAAKH,KAAK,CAAC+C,IAAN,CAAW3C,GAAhB,WAFe;MAGlBC,IAAI,EAAE;QACJC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GADlC;QAEJM,QAAQ,EAAEV,KAAK,CAACU;MAFZ;IAHY,CAAb,EAQJC,IARI,CAQC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAJ,CAASL,KAAlB;IAAA,CARD,EASJyD,KATI,CASE,UAACC,MAAD,EAAY;MACjB,IAAIA,MAAM,YAAYC,yBAAA,CAAeC,QAArC,EAA+C;QAC7C,OAAO,MAAI,CAACC,GAAL,CAAS7D,KAAT,CAAP;MACD;;MAED,OAAO,iBAAQ8D,MAAR,CAAeJ,MAAf,CAAP;IACD,CAfI,CAAP;EAgBD,CArZ8B;;EAuZ/B;AACF;AACA;AACA;AACA;AACA;EACEW,IA7Z+B,kBA6ZxB;IACL,OAAO,KAAKpE,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBuC,OAAO,EAAE,OAFS;MAGlBC,QAAQ,EAAE;IAHQ,CAAb,EAKJ/B,IALI,CAKC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAJ,CAASiE,IAAlB;IAAA,CALD,CAAP;EAMD,CApa8B;;EAsa/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,KA9a+B,iBA8azBzD,OA9ayB,EA8ahBC,QA9agB,EA8aN;IACvB;IACA,IAAI,CAACA,QAAQ,CAACM,YAAd,EAA4B;MAC1B,OAAON,QAAP;IACD;;IAED,IAAMyD,IAAI,GAAG,yBAAU1D,OAAV,CAAb,CANuB,CAQvB;IACA;IACA;;IACA,mBAAYC,QAAZ,EAAsB0D,OAAtB,CAA8B,UAACC,GAAD,EAAS;MACrC,IAAIA,GAAG,KAAK,cAAR,IAA0BA,GAAG,KAAK,cAAtC,EAAsD;QACpD;MACD;;MAEDF,IAAI,CAACE,GAAD,CAAJ,GAAY3D,QAAQ,CAAC2D,GAAD,CAAR,IAAiBF,IAAI,CAACE,GAAD,CAAjC;IACD,CAND,EAXuB,CAmBvB;IACA;;IAEA,IAAI3D,QAAQ,CAAC4D,YAAT,IAAyB5D,QAAQ,CAAC4D,YAAT,CAAsBzD,MAAnD,EAA2D;MACzD,IAAM0D,QAAQ,GAAG,kBAAjB;MACA,IAAMC,QAAQ,GAAG,kBAAjB;MAEA9D,QAAQ,CAAC4D,YAAT,CAAsBF,OAAtB,CAA8B,UAACK,CAAD,EAAO;QACnC,IAAIA,CAAC,CAACC,OAAN,EAAe;UACb;UACA;UACA;UACAH,QAAQ,CAACI,GAAT,CAAaF,CAAC,CAAC1E,GAAf;QACD,CALD,MAMK;UACH;UACA;UACAyE,QAAQ,CAACI,GAAT,CAAaH,CAAC,CAAC1E,GAAf,EAAoB0E,CAApB;QACD;MACF,CAZD,EAJyD,CAkBzD;MACA;MACA;MACA;;MACA,IAAMH,YAAY,GAAGH,IAAI,CAACG,YAAL,CAAkBO,MAAlB,CAAyB,UAACC,GAAD,EAAML,CAAN,EAAY;QACxD,IAAI,CAACF,QAAQ,CAACQ,GAAT,CAAaN,CAAC,CAAC1E,GAAf,CAAL,EAA0B;UACxB+E,GAAG,CAACL,CAAC,CAAC1E,GAAH,CAAH,GAAa0E,CAAb;QACD;;QAED,OAAOK,GAAP;MACD,CANoB,EAMlB,EANkB,CAArB;MAQAN,QAAQ,CAACJ,OAAT,CAAiB,UAACY,KAAD,EAAQX,GAAR,EAAgB;QAC/BC,YAAY,CAACD,GAAD,CAAZ,GAAoBW,KAApB;MACD,CAFD;MAIAb,IAAI,CAACG,YAAL,GAAoB,qBAAcA,YAAd,CAApB;IACD;;IAED,OAAOH,IAAP;EACD,CA1e8B;;EA4e/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEc,iBAnf+B,6BAmfbtF,KAnfa,EAmfNuF,KAnfM,EAmfC;IAC9B,OAAO,KAAKhF,KAAL,CAAWN,OAAX,CAAmB;MACxBE,GAAG,EAAEoF,KAAK,CAACnF,GADa;MAExBF,MAAM,EAAE,KAFgB;MAGxBG,IAAI,EAAE;QACJmF,KAAK,EAAE;UACLC,WAAW,EAAE;QADR;MADH;IAHkB,CAAnB,EASJ9E,IATI,CASC;MAAA,IAAEN,IAAF,QAAEA,IAAF;MAAA,OAAYA,IAAZ;IAAA,CATD,CAAP;EAUD,CA9f8B;;EAggB/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEqF,iBAvgB+B,6BAugBb1F,KAvgBa,EAugBNuF,KAvgBM,EAugBC;IAC9B,OAAO,KAAKhF,KAAL,CAAWN,OAAX,CAAmB;MACxBE,GAAG,EAAEoF,KAAK,CAACnF,GADa;MAExBF,MAAM,EAAE,KAFgB;MAGxBG,IAAI,EAAE;QACJmF,KAAK,EAAE;UACLG,WAAW,EAAE;YACXvF,GAAG,EAAEJ,KAAK,CAAC+C,IAAN,CAAW3C,GADL;YAEX4C,OAAO,EAAE,CAAC;cAAC5C,GAAG,EAAE,KAAKG,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL;YAAjC,CAAD;UAFE,CADR;UAKLqF,WAAW,EAAE;QALR;MADH;IAHkB,CAAnB,EAaJ9E,IAbI,CAaC;MAAA,IAAEN,IAAF,SAAEA,IAAF;MAAA,OAAYA,IAAZ;IAAA,CAbD,CAAP;EAcD,CAthB8B;;EAwhB/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEuF,QAhiB+B,oBAgiBtB5F,KAhiBsB,EAgiBf6F,KAhiBe,EAgiBR;IACrB,OAAO,KAAK5F,OAAL,CAAa;MAClBC,MAAM,EAAE,MADU;MAElBC,GAAG,YAAKH,KAAK,CAAC+C,IAAN,CAAW3C,GAAhB,cAFe;MAGlBC,IAAI,EAAE;QACJC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GADlC;QAEJ0F,IAAI,EAAE;UACJtD,aAAa,EAAEuD,aAAA,CAAKC,EAAL,EADX;UAEJH,KAAK,EAALA;QAFI;MAFF;IAHY,CAAb,CAAP;EAWD,CA5iB8B;;EA8iB/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEI,IArjB+B,gBAqjB1BjG,KArjB0B,EAqjBnB;IACV,OAAO,KAAKC,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBC,GAAG,EAAEH,KAAK,CAACkG;IAFO,CAAb,EAIL;IACA;IALK,CAMJvF,IANI,CAMC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAJ,IAAY,EAArB;IAAA,CAND,CAAP;EAOD,CA7jB8B;;EA+jB/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE8F,WA5kB+B,uBA4kBnBnG,KA5kBmB,SA8kB5B;IAAA,IADD8C,GACC,SADDA,GACC;IAAA,IADIsD,UACJ,SADIA,UACJ;IAAA,IADgBC,UAChB,SADgBA,UAChB;IAAA,IAD4BC,OAC5B,SAD4BA,OAC5B;IACD,IAAM1D,QAAQ,GAAG;MACfwD,UAAU,EAAVA,UADe;MAEfC,UAAU,EAAVA;IAFe,CAAjB;;IAKA,IAAIvD,GAAJ,EAAS;MACPF,QAAQ,CAACC,IAAT,GAAgB,KAAhB;MACAD,QAAQ,CAACE,GAAT,GAAeA,GAAf;IACD;;IAED,OAAO,KAAK7C,OAAL,CAAa;MAClBC,MAAM,EAAE,KADU;MAElBC,GAAG,YAAKH,KAAK,CAAC+C,IAAN,CAAW3C,GAAhB,WAFe;MAGlBC,IAAI,EAAE;QACJC,SAAS,EAAE,KAAKC,KAAL,CAAWC,QAAX,CAAoBC,MAApB,CAA2BL,GADlC;QAEJuC,WAAW,EAAE,CAAC;UACZC,QAAQ,EAAE,wBAAeA,QAAf,CADE;UAEZ0D,OAAO,EAAPA;QAFY,CAAD,CAFT;QAMJ5F,QAAQ,EAAEV,KAAK,CAACU;MANZ;IAHY,CAAb,EAYJC,IAZI,CAYC,UAACC,GAAD;MAAA,OAASA,GAAG,CAACP,IAAJ,CAASL,KAAlB;IAAA,CAZD,CAAP;EAaD,CAtmB8B;EAAA;AAAA,CAAnB,CAAd;;eAymBeL,K"}
1
+ {"version":3,"names":["USE_INCOMING","USE_CURRENT","EQUAL","FETCH","GREATER_THAN","LESS_THAN","DESYNC","compareToAction","result","Error","Locus","WebexPlugin","extend","namespace","alert","locus","request","method","uri","url","body","deviceUrl","webex","internal","device","sequence","then","res","compare","current","incoming","isEmpty","entries","length","rangeStart","rangeEnd","baseSequence","compareDelta","compareSequence","ret","getEntriesFirstValue","getEntriesLastValue","getCompareFirstValue","getCompareLastValue","inRange","entry","currentOnlyEntries","incomingOnlyEntries","currentOnly","incomingOnly","i","push","create","invitee","options","correlationId","service","resource","localMedias","localSdp","type","sdp","self","devices","map","item","index","mediaConnections","createOrJoin","target","join","decline","catch","reason","WebexHttpError","Conflict","get","reject","getCallHistory","from","Date","toISOString","qs","leave","list","loci","merge","next","forEach","key","participants","toRemove","toUpsert","p","removed","add","set","reduce","acc","has","value","releaseFloorGrant","share","floor","disposition","requestFloorGrant","beneficiary","sendDtmf","tones","dtmf","uuid","v4","sync","syncUrl","updateMedia","audioMuted","videoMuted","mediaId"],"sources":["locus.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin, WebexHttpError} from '@webex/webex-core';\nimport {cloneDeep, difference, first, last, memoize} from 'lodash';\nimport uuid from 'uuid';\n\nexport const USE_INCOMING = 'USE_INCOMING';\nexport const USE_CURRENT = 'USE_CURRENT';\nexport const EQUAL = 'EQUAL';\nexport const FETCH = 'FETCH';\nexport const GREATER_THAN = 'GREATER_THAN';\nexport const LESS_THAN = 'LESS_THAN';\nexport const DESYNC = 'DESYNC';\n\n/**\n * Transates the result of a sequence comparison into an intended behavior\n * @param {string} result\n * @private\n * @returns {string}\n */\nfunction compareToAction(result) {\n switch (result) {\n case EQUAL:\n case GREATER_THAN:\n return USE_CURRENT;\n case LESS_THAN:\n return USE_INCOMING;\n case DESYNC:\n return FETCH;\n default:\n throw new Error(`${result} is not a recognized sequence comparison result`);\n }\n}\n\n/**\n * @class\n */\nconst Locus = WebexPlugin.extend({\n namespace: 'Locus',\n\n /**\n * Alert the specified locus that the local user has been notified of the\n * locus's active state\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Promise}\n */\n alert(locus) {\n return this.request({\n method: 'PUT',\n uri: `${locus.url}/participant/alert`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n sequence: locus.sequence,\n },\n }).then((res) => res.body);\n },\n\n /**\n * Compares two loci to determine which one contains the most recent state\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} one of USE_INCOMING, USE_CURRENT, or FETCH\n */\n compare(current, incoming) {\n /**\n * Determines if a paricular locus's sequence is empty\n * @param {Types~Locus} locus\n * @private\n * @returns {bool}\n */\n function isEmpty(locus) {\n const {sequence} = locus;\n\n return (\n (!sequence.entries || !sequence.entries.length) &&\n sequence.rangeStart === 0 &&\n sequence.rangeEnd === 0\n );\n }\n\n if (isEmpty(current) || isEmpty(incoming)) {\n return USE_INCOMING;\n }\n\n if (incoming.baseSequence) {\n return this.compareDelta(current, incoming);\n }\n\n return compareToAction(this.compareSequence(current.sequence, incoming.sequence));\n },\n\n /**\n * Compares two loci sequences (with delta params) and indicates what action\n * to take.\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @private\n * @returns {string} one of USE_INCOMING, USE_CURRENT, or FETCH\n */\n compareDelta(current, incoming) {\n let ret = this.compareSequence(current.sequence, incoming.sequence);\n\n if (ret !== LESS_THAN) {\n return compareToAction(ret);\n }\n\n ret = this.compareSequence(current.sequence, incoming.baseSequence);\n\n switch (ret) {\n case GREATER_THAN:\n case EQUAL:\n return USE_INCOMING;\n default:\n return FETCH;\n }\n },\n\n /**\n * Compares two Locus sequences\n * @instance\n * @memberof Locus\n * @param {LocusSequence} current\n * @param {LocusSequence} incoming\n * @returns {string} one of LESS_THAN, GREATER_THAN, EQUAL, or DESYNC\n */\n compareSequence(current, incoming) {\n if (!current) {\n throw new Error('`current` is required');\n }\n\n if (!incoming) {\n throw new Error('`incoming` is required');\n }\n // complexity here is unavoidable\n /* eslint complexity: [0] */\n /* eslint max-statements: [0] */\n\n // must pick one of arrow-body-style or no-confusing-arrow to disable\n /* eslint arrow-body-style: [0] */\n\n // after running the #compare() test suite in a loop, there doesn't seem to\n // be any appreciable difference when used with or without memoize; since\n // real locus sequences are likely to contain more sequence numbers than\n // those in the test suite, I have to assume memoize can only help and the\n // overhead of memoizing these methods is not a problem.\n\n const getEntriesFirstValue = memoize((sequence) => {\n return sequence.entries.length === 0 ? 0 : first(sequence.entries);\n });\n const getEntriesLastValue = memoize((sequence) => {\n return sequence.entries.length === 0 ? 0 : last(sequence.entries);\n });\n const getCompareFirstValue = memoize((sequence) => {\n return sequence.rangeStart || getEntriesFirstValue(sequence);\n });\n const getCompareLastValue = memoize((sequence) => {\n return getEntriesLastValue(sequence) || sequence.rangeEnd;\n });\n\n /**\n * @param {number} entry\n * @param {LocusSequence} sequence\n * @private\n * @returns {Boolean}\n */\n function inRange(entry, sequence) {\n return entry >= sequence.rangeStart && entry <= sequence.rangeEnd;\n }\n\n if (getCompareFirstValue(current) > getCompareLastValue(incoming)) {\n return GREATER_THAN;\n }\n\n if (getCompareLastValue(current) < getCompareFirstValue(incoming)) {\n return LESS_THAN;\n }\n\n const currentOnlyEntries = difference(current.entries, incoming.entries);\n const incomingOnlyEntries = difference(incoming.entries, current.entries);\n const currentOnly = [];\n const incomingOnly = [];\n\n for (const i of currentOnlyEntries) {\n if (!inRange(i, incoming)) {\n currentOnly.push(i);\n }\n }\n for (const i of incomingOnlyEntries) {\n if (!inRange(i, current)) {\n incomingOnly.push(i);\n }\n }\n\n if (!currentOnly.length && !incomingOnly.length) {\n if (\n current.rangeEnd - getCompareFirstValue(current) >\n incoming.rangeEnd - getCompareFirstValue(incoming)\n ) {\n return GREATER_THAN;\n }\n\n if (\n current.rangeEnd - getCompareFirstValue(current) <\n incoming.rangeEnd - getCompareFirstValue(incoming)\n ) {\n return LESS_THAN;\n }\n\n return EQUAL;\n }\n\n if (currentOnly.length && !incomingOnly.length) {\n return GREATER_THAN;\n }\n\n if (!currentOnly.length && incomingOnly.length) {\n return LESS_THAN;\n }\n\n if (!current.rangeStart && !current.rangeEnd && !incoming.rangeStart && !incoming.rangeEnd) {\n return DESYNC;\n }\n\n for (const i of currentOnly) {\n if (getCompareFirstValue(incoming) < i && i < getCompareLastValue(incoming)) {\n return DESYNC;\n }\n }\n\n for (const i of incomingOnly) {\n if (getCompareFirstValue(current) < i && i < getCompareLastValue(current)) {\n return DESYNC;\n }\n }\n\n if (currentOnly[0] > incomingOnly[0]) {\n return GREATER_THAN;\n }\n\n return LESS_THAN;\n },\n\n /**\n * Calls the specified invitee and offers the specified media via\n * options.localSdp\n * @instance\n * @memberof Locus\n * @param {string} invitee\n * @param {Object} options\n * @param {Object} options.localSdp\n * @returns {Promise<Types~Locus>}\n */\n create(invitee, options = {}) {\n const {correlationId} = options;\n\n if (!correlationId) {\n throw new Error('options.correlationId is required');\n }\n\n return (\n this.request({\n method: 'POST',\n service: 'locus',\n resource: 'loci/call',\n body: {\n correlationId,\n deviceUrl: this.webex.internal.device.url,\n invitee: {\n invitee,\n },\n localMedias: [\n {\n localSdp: JSON.stringify({\n type: 'SDP',\n sdp: options.localSdp,\n }),\n },\n ],\n sequence: {\n entries: [],\n rangeStart: 0,\n rangeEnd: 0,\n },\n },\n })\n // res.body.mediaConnections is deprecated so just return the locus\n .then((res) => {\n res.body.locus.self.devices.map((item, index) => {\n item.mediaConnections = [res.body.mediaConnections[index]];\n\n return item;\n });\n\n return res.body.locus;\n })\n );\n },\n\n /**\n * This is mostly an internal function to simplify the phone plugin. Decides\n * which path to call based on the type of the thing being joined.\n * @instance\n * @memberof Locus\n * @param {Object|Types~Locus} target\n * @param {Object} options\n * @private\n * @returns {Promise<Types~Locus>}\n */\n createOrJoin(target, options) {\n if (target.url) {\n return this.join(target, options);\n }\n\n return this.create(target, options);\n },\n\n /**\n * Decline to join the specified Locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Promise<Types~Locus>}\n */\n decline(locus) {\n return this.request({\n method: 'PUT',\n uri: `${locus.url}/participant/decline`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n sequence: locus.sequence,\n },\n })\n .then((res) => res.body)\n .catch((reason) => {\n if (reason instanceof WebexHttpError.Conflict) {\n return this.get(locus);\n }\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Retrieves a single Locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Types~Locus}\n */\n get(locus) {\n return this.request({\n method: 'GET',\n uri: `${locus.url}`,\n }).then((res) => res.body);\n },\n\n /**\n * Retrieves the call history for the current user\n * @instance\n * @memberof Locus\n * @param {Object} options\n * @param {Date|number} options.from\n * @returns {Promise<Object>}\n */\n getCallHistory(options = {}) {\n const from = new Date(options.from || Date.now()).toISOString();\n\n return this.request({\n method: 'GET',\n service: 'janus',\n resource: 'history/userSessions',\n qs: {from},\n }).then((res) => res.body);\n },\n\n /**\n * Join the specified Locus and offer to send it media\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @param {Object} options\n * @param {Object} options.localSdp\n * @returns {Types~Locus}\n */\n join(locus, options = {}) {\n const correlationId = locus.correlationId || options.correlationId;\n\n if (!correlationId) {\n throw new Error('locus.correlationId or options.correlationId is required');\n }\n\n return (\n this.request({\n method: 'POST',\n uri: `${locus.url}/participant`,\n body: {\n correlationId,\n deviceUrl: this.webex.internal.device.url,\n localMedias: [\n {\n localSdp: JSON.stringify({\n type: 'SDP',\n sdp: options.localSdp,\n }),\n },\n ],\n sequence: locus.sequence || {\n entries: [],\n rangeStart: 0,\n rangeEnd: 0,\n },\n },\n })\n // The mediaConnections object is deprecated, so just return the locus\n .then((res) => {\n res.body.locus.self.devices.map((item, index) => {\n item.mediaConnections = [res.body.mediaConnections[index]];\n\n return item;\n });\n\n return res.body.locus;\n })\n );\n },\n\n /**\n * Leave the specified Locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Promise<Types~Locus>}\n */\n leave(locus) {\n return this.request({\n method: 'PUT',\n uri: `${locus.self.url}/leave`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n sequence: locus.sequence,\n },\n })\n .then((res) => res.body.locus)\n .catch((reason) => {\n if (reason instanceof WebexHttpError.Conflict) {\n return this.get(locus);\n }\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Lists active loci\n * @instance\n * @memberof Locus\n * @returns {Promise<Array<Types~Locus>>}\n */\n list() {\n return this.request({\n method: 'GET',\n service: 'locus',\n resource: 'loci',\n }).then((res) => res.body.loci);\n },\n\n /**\n * Merges two locus DTOs (for the same locus)\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus|Types~LocusDelta} incoming\n * @returns {Type~Locus}\n */\n merge(current, incoming) {\n // if incoming is not a delta event, treat it as a new full locus.\n if (!incoming.baseSequence) {\n return incoming;\n }\n\n const next = cloneDeep(current);\n\n // 1. All non-null elements in the delta event except the \"baseSequence\" and\n // the \"participants\" collection should be used to replace their existing\n // values.\n Object.keys(incoming).forEach((key) => {\n if (key === 'baseSequence' || key === 'participants') {\n return;\n }\n\n next[key] = incoming[key] || next[key];\n });\n\n // 2. The \"baseSequence\" in the delta event can be discarded (it doesn't\n // need to be maintained in the local working copy).\n\n if (incoming.participants || incoming.participants.length) {\n const toRemove = new Set();\n const toUpsert = new Map();\n\n incoming.participants.forEach((p) => {\n if (p.removed) {\n // Elements of the delta event's \"participants\" list with the\n // attribute `removed=true` should be removed from the working copy's\n // \"participants\" collection.\n toRemove.add(p.url);\n } else {\n // Elements of the delta events \"participants\" list that are absent\n // from the local working copy should be added to that collection.\n toUpsert.set(p.url, p);\n }\n });\n\n // The \"participants\" collection in the delta event should be merged with\n // that of the local working copy of the Locus such that elements in the\n // delta event's \"participants\" replace those with the same url value in\n // the working copy \"participants\" collection.\n const participants = next.participants.reduce((acc, p) => {\n if (!toRemove.has(p.url)) {\n acc[p.url] = p;\n }\n\n return acc;\n }, {});\n\n toUpsert.forEach((value, key) => {\n participants[key] = value;\n });\n\n next.participants = Object.values(participants);\n }\n\n return next;\n },\n\n /**\n * Signals to locus that the current user is done sharing their additional\n * media stream\n * @param {Types~Locus} locus\n * @param {Types~MediaShare} share\n * @returns {Promise}\n */\n releaseFloorGrant(locus, share) {\n return this.webex\n .request({\n uri: share.url,\n method: 'PUT',\n body: {\n floor: {\n disposition: 'RELEASED',\n },\n },\n })\n .then(({body}) => body);\n },\n\n /**\n * Signals to locus that the current user would like to share an additional\n * media stream\n * @param {Types~Locus} locus\n * @param {Types~MediaShare} share\n * @returns {Promise}\n */\n requestFloorGrant(locus, share) {\n return this.webex\n .request({\n uri: share.url,\n method: 'PUT',\n body: {\n floor: {\n beneficiary: {\n url: locus.self.url,\n devices: [{url: this.webex.internal.device.url}],\n },\n disposition: 'GRANTED',\n },\n },\n })\n .then(({body}) => body);\n },\n\n /**\n * Sends a string of DTMF tones to the locus\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @param {string} tones\n * @returns {Promise}\n */\n sendDtmf(locus, tones) {\n return this.request({\n method: 'POST',\n uri: `${locus.self.url}/sendDtmf`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n dtmf: {\n correlationId: uuid.v4(),\n tones,\n },\n },\n });\n },\n\n /**\n * Fetches the delta for the locus from its syncUrl. *Does not merge*\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @returns {Types~LocusDelta}\n */\n sync(locus) {\n return (\n this.request({\n method: 'GET',\n uri: locus.syncUrl,\n })\n // the api may return a 204 no content, so we'll give back an empty\n // object in that case.\n .then((res) => res.body || {})\n );\n },\n\n /**\n * Send a new sdp to Linus via the Locus API to update media state (e.g. to\n * start or stop sending audio or video)\n * @instance\n * @memberof Locus\n * @param {Types~Locus} locus\n * @param {Object} options\n * @param {string} options.localSdp\n * @param {string} options.mediaId\n * @param {Boolean} options.audioMuted\n * @param {Boolean} options.videoMuted\n * @returns {Promise<Types~Locus>}\n */\n updateMedia(locus, {sdp, audioMuted, videoMuted, mediaId}) {\n const localSdp = {\n audioMuted,\n videoMuted,\n };\n\n if (sdp) {\n localSdp.type = 'SDP';\n localSdp.sdp = sdp;\n }\n\n return this.request({\n method: 'PUT',\n uri: `${locus.self.url}/media`,\n body: {\n deviceUrl: this.webex.internal.device.url,\n localMedias: [\n {\n localSdp: JSON.stringify(localSdp),\n mediaId,\n },\n ],\n sequence: locus.sequence,\n },\n }).then((res) => res.body.locus);\n },\n});\n\nexport default Locus;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAIA;AAEA;AAAwB;AAAA;AAAA;AAEjB,IAAMA,YAAY,GAAG,cAAc;AAAC;AACpC,IAAMC,WAAW,GAAG,aAAa;AAAC;AAClC,IAAMC,KAAK,GAAG,OAAO;AAAC;AACtB,IAAMC,KAAK,GAAG,OAAO;AAAC;AACtB,IAAMC,YAAY,GAAG,cAAc;AAAC;AACpC,IAAMC,SAAS,GAAG,WAAW;AAAC;AAC9B,IAAMC,MAAM,GAAG,QAAQ;;AAE9B;AACA;AACA;AACA;AACA;AACA;AALA;AAMA,SAASC,eAAe,CAACC,MAAM,EAAE;EAC/B,QAAQA,MAAM;IACZ,KAAKN,KAAK;IACV,KAAKE,YAAY;MACf,OAAOH,WAAW;IACpB,KAAKI,SAAS;MACZ,OAAOL,YAAY;IACrB,KAAKM,MAAM;MACT,OAAOH,KAAK;IACd;MACE,MAAM,IAAIM,KAAK,WAAID,MAAM,qDAAkD;EAAC;AAElF;;AAEA;AACA;AACA;AACA,IAAME,KAAK,GAAGC,sBAAW,CAACC,MAAM,CAAC;EAC/BC,SAAS,EAAE,OAAO;EAElB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,KAAK,iBAACC,KAAK,EAAE;IACX,OAAO,IAAI,CAACC,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbC,GAAG,YAAKH,KAAK,CAACI,GAAG,uBAAoB;MACrCC,IAAI,EAAE;QACJC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzCM,QAAQ,EAAEV,KAAK,CAACU;MAClB;IACF,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEQ,OAAO,mBAACC,OAAO,EAAEC,QAAQ,EAAE;IACzB;AACJ;AACA;AACA;AACA;AACA;IACI,SAASC,OAAO,CAAChB,KAAK,EAAE;MACtB,IAAOU,QAAQ,GAAIV,KAAK,CAAjBU,QAAQ;MAEf,OACE,CAAC,CAACA,QAAQ,CAACO,OAAO,IAAI,CAACP,QAAQ,CAACO,OAAO,CAACC,MAAM,KAC9CR,QAAQ,CAACS,UAAU,KAAK,CAAC,IACzBT,QAAQ,CAACU,QAAQ,KAAK,CAAC;IAE3B;IAEA,IAAIJ,OAAO,CAACF,OAAO,CAAC,IAAIE,OAAO,CAACD,QAAQ,CAAC,EAAE;MACzC,OAAO9B,YAAY;IACrB;IAEA,IAAI8B,QAAQ,CAACM,YAAY,EAAE;MACzB,OAAO,IAAI,CAACC,YAAY,CAACR,OAAO,EAAEC,QAAQ,CAAC;IAC7C;IAEA,OAAOvB,eAAe,CAAC,IAAI,CAAC+B,eAAe,CAACT,OAAO,CAACJ,QAAQ,EAAEK,QAAQ,CAACL,QAAQ,CAAC,CAAC;EACnF,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEY,YAAY,wBAACR,OAAO,EAAEC,QAAQ,EAAE;IAC9B,IAAIS,GAAG,GAAG,IAAI,CAACD,eAAe,CAACT,OAAO,CAACJ,QAAQ,EAAEK,QAAQ,CAACL,QAAQ,CAAC;IAEnE,IAAIc,GAAG,KAAKlC,SAAS,EAAE;MACrB,OAAOE,eAAe,CAACgC,GAAG,CAAC;IAC7B;IAEAA,GAAG,GAAG,IAAI,CAACD,eAAe,CAACT,OAAO,CAACJ,QAAQ,EAAEK,QAAQ,CAACM,YAAY,CAAC;IAEnE,QAAQG,GAAG;MACT,KAAKnC,YAAY;MACjB,KAAKF,KAAK;QACR,OAAOF,YAAY;MACrB;QACE,OAAOG,KAAK;IAAC;EAEnB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEmC,eAAe,2BAACT,OAAO,EAAEC,QAAQ,EAAE;IACjC,IAAI,CAACD,OAAO,EAAE;MACZ,MAAM,IAAIpB,KAAK,CAAC,uBAAuB,CAAC;IAC1C;IAEA,IAAI,CAACqB,QAAQ,EAAE;MACb,MAAM,IAAIrB,KAAK,CAAC,wBAAwB,CAAC;IAC3C;IACA;IACA;IACA;;IAEA;IACA;;IAEA;IACA;IACA;IACA;IACA;;IAEA,IAAM+B,oBAAoB,GAAG,uBAAQ,UAACf,QAAQ,EAAK;MACjD,OAAOA,QAAQ,CAACO,OAAO,CAACC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,qBAAMR,QAAQ,CAACO,OAAO,CAAC;IACpE,CAAC,CAAC;IACF,IAAMS,mBAAmB,GAAG,uBAAQ,UAAChB,QAAQ,EAAK;MAChD,OAAOA,QAAQ,CAACO,OAAO,CAACC,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,oBAAKR,QAAQ,CAACO,OAAO,CAAC;IACnE,CAAC,CAAC;IACF,IAAMU,oBAAoB,GAAG,uBAAQ,UAACjB,QAAQ,EAAK;MACjD,OAAOA,QAAQ,CAACS,UAAU,IAAIM,oBAAoB,CAACf,QAAQ,CAAC;IAC9D,CAAC,CAAC;IACF,IAAMkB,mBAAmB,GAAG,uBAAQ,UAAClB,QAAQ,EAAK;MAChD,OAAOgB,mBAAmB,CAAChB,QAAQ,CAAC,IAAIA,QAAQ,CAACU,QAAQ;IAC3D,CAAC,CAAC;;IAEF;AACJ;AACA;AACA;AACA;AACA;IACI,SAASS,OAAO,CAACC,KAAK,EAAEpB,QAAQ,EAAE;MAChC,OAAOoB,KAAK,IAAIpB,QAAQ,CAACS,UAAU,IAAIW,KAAK,IAAIpB,QAAQ,CAACU,QAAQ;IACnE;IAEA,IAAIO,oBAAoB,CAACb,OAAO,CAAC,GAAGc,mBAAmB,CAACb,QAAQ,CAAC,EAAE;MACjE,OAAO1B,YAAY;IACrB;IAEA,IAAIuC,mBAAmB,CAACd,OAAO,CAAC,GAAGa,oBAAoB,CAACZ,QAAQ,CAAC,EAAE;MACjE,OAAOzB,SAAS;IAClB;IAEA,IAAMyC,kBAAkB,GAAG,0BAAWjB,OAAO,CAACG,OAAO,EAAEF,QAAQ,CAACE,OAAO,CAAC;IACxE,IAAMe,mBAAmB,GAAG,0BAAWjB,QAAQ,CAACE,OAAO,EAAEH,OAAO,CAACG,OAAO,CAAC;IACzE,IAAMgB,WAAW,GAAG,EAAE;IACtB,IAAMC,YAAY,GAAG,EAAE;IAAC,2CAERH,kBAAkB;MAAA;IAAA;MAAlC,oDAAoC;QAAA,IAAzBI,GAAC;QACV,IAAI,CAACN,OAAO,CAACM,GAAC,EAAEpB,QAAQ,CAAC,EAAE;UACzBkB,WAAW,CAACG,IAAI,CAACD,GAAC,CAAC;QACrB;MACF;IAAC;MAAA;IAAA;MAAA;IAAA;IAAA,4CACeH,mBAAmB;MAAA;IAAA;MAAnC,uDAAqC;QAAA,IAA1BG,GAAC;QACV,IAAI,CAACN,OAAO,CAACM,GAAC,EAAErB,OAAO,CAAC,EAAE;UACxBoB,YAAY,CAACE,IAAI,CAACD,GAAC,CAAC;QACtB;MACF;IAAC;MAAA;IAAA;MAAA;IAAA;IAED,IAAI,CAACF,WAAW,CAACf,MAAM,IAAI,CAACgB,YAAY,CAAChB,MAAM,EAAE;MAC/C,IACEJ,OAAO,CAACM,QAAQ,GAAGO,oBAAoB,CAACb,OAAO,CAAC,GAChDC,QAAQ,CAACK,QAAQ,GAAGO,oBAAoB,CAACZ,QAAQ,CAAC,EAClD;QACA,OAAO1B,YAAY;MACrB;MAEA,IACEyB,OAAO,CAACM,QAAQ,GAAGO,oBAAoB,CAACb,OAAO,CAAC,GAChDC,QAAQ,CAACK,QAAQ,GAAGO,oBAAoB,CAACZ,QAAQ,CAAC,EAClD;QACA,OAAOzB,SAAS;MAClB;MAEA,OAAOH,KAAK;IACd;IAEA,IAAI8C,WAAW,CAACf,MAAM,IAAI,CAACgB,YAAY,CAAChB,MAAM,EAAE;MAC9C,OAAO7B,YAAY;IACrB;IAEA,IAAI,CAAC4C,WAAW,CAACf,MAAM,IAAIgB,YAAY,CAAChB,MAAM,EAAE;MAC9C,OAAO5B,SAAS;IAClB;IAEA,IAAI,CAACwB,OAAO,CAACK,UAAU,IAAI,CAACL,OAAO,CAACM,QAAQ,IAAI,CAACL,QAAQ,CAACI,UAAU,IAAI,CAACJ,QAAQ,CAACK,QAAQ,EAAE;MAC1F,OAAO7B,MAAM;IACf;IAEA,gCAAgB0C,WAAW,kCAAE;MAAxB,IAAME,CAAC;MACV,IAAIR,oBAAoB,CAACZ,QAAQ,CAAC,GAAGoB,CAAC,IAAIA,CAAC,GAAGP,mBAAmB,CAACb,QAAQ,CAAC,EAAE;QAC3E,OAAOxB,MAAM;MACf;IACF;IAEA,kCAAgB2C,YAAY,qCAAE;MAAzB,IAAMC,GAAC;MACV,IAAIR,oBAAoB,CAACb,OAAO,CAAC,GAAGqB,GAAC,IAAIA,GAAC,GAAGP,mBAAmB,CAACd,OAAO,CAAC,EAAE;QACzE,OAAOvB,MAAM;MACf;IACF;IAEA,IAAI0C,WAAW,CAAC,CAAC,CAAC,GAAGC,YAAY,CAAC,CAAC,CAAC,EAAE;MACpC,OAAO7C,YAAY;IACrB;IAEA,OAAOC,SAAS;EAClB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE+C,MAAM,kBAACC,OAAO,EAAgB;IAAA,IAAdC,OAAO,uEAAG,CAAC,CAAC;IAC1B,IAAOC,aAAa,GAAID,OAAO,CAAxBC,aAAa;IAEpB,IAAI,CAACA,aAAa,EAAE;MAClB,MAAM,IAAI9C,KAAK,CAAC,mCAAmC,CAAC;IACtD;IAEA,OACE,IAAI,CAACO,OAAO,CAAC;MACXC,MAAM,EAAE,MAAM;MACduC,OAAO,EAAE,OAAO;MAChBC,QAAQ,EAAE,WAAW;MACrBrC,IAAI,EAAE;QACJmC,aAAa,EAAbA,aAAa;QACblC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzCkC,OAAO,EAAE;UACPA,OAAO,EAAPA;QACF,CAAC;QACDK,WAAW,EAAE,CACX;UACEC,QAAQ,EAAE,wBAAe;YACvBC,IAAI,EAAE,KAAK;YACXC,GAAG,EAAEP,OAAO,CAACK;UACf,CAAC;QACH,CAAC,CACF;QACDlC,QAAQ,EAAE;UACRO,OAAO,EAAE,EAAE;UACXE,UAAU,EAAE,CAAC;UACbC,QAAQ,EAAE;QACZ;MACF;IACF,CAAC;IACC;IAAA,CACCT,IAAI,CAAC,UAACC,GAAG,EAAK;MACbA,GAAG,CAACP,IAAI,CAACL,KAAK,CAAC+C,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,UAACC,IAAI,EAAEC,KAAK,EAAK;QAC/CD,IAAI,CAACE,gBAAgB,GAAG,CAACxC,GAAG,CAACP,IAAI,CAAC+C,gBAAgB,CAACD,KAAK,CAAC,CAAC;QAE1D,OAAOD,IAAI;MACb,CAAC,CAAC;MAEF,OAAOtC,GAAG,CAACP,IAAI,CAACL,KAAK;IACvB,CAAC,CAAC;EAER,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEqD,YAAY,wBAACC,MAAM,EAAEf,OAAO,EAAE;IAC5B,IAAIe,MAAM,CAAClD,GAAG,EAAE;MACd,OAAO,IAAI,CAACmD,IAAI,CAACD,MAAM,EAAEf,OAAO,CAAC;IACnC;IAEA,OAAO,IAAI,CAACF,MAAM,CAACiB,MAAM,EAAEf,OAAO,CAAC;EACrC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEiB,OAAO,mBAACxD,KAAK,EAAE;IAAA;IACb,OAAO,IAAI,CAACC,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbC,GAAG,YAAKH,KAAK,CAACI,GAAG,yBAAsB;MACvCC,IAAI,EAAE;QACJC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzCM,QAAQ,EAAEV,KAAK,CAACU;MAClB;IACF,CAAC,CAAC,CACCC,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI;IAAA,EAAC,CACvBoD,KAAK,CAAC,UAACC,MAAM,EAAK;MACjB,IAAIA,MAAM,YAAYC,yBAAc,CAACC,QAAQ,EAAE;QAC7C,OAAO,KAAI,CAACC,GAAG,CAAC7D,KAAK,CAAC;MACxB;MAEA,OAAO,iBAAQ8D,MAAM,CAACJ,MAAM,CAAC;IAC/B,CAAC,CAAC;EACN,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,GAAG,eAAC7D,KAAK,EAAE;IACT,OAAO,IAAI,CAACC,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbC,GAAG,YAAKH,KAAK,CAACI,GAAG;IACnB,CAAC,CAAC,CAACO,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE0D,cAAc,4BAAe;IAAA,IAAdxB,OAAO,uEAAG,CAAC,CAAC;IACzB,IAAMyB,IAAI,GAAG,IAAIC,IAAI,CAAC1B,OAAO,CAACyB,IAAI,IAAI,mBAAU,CAAC,CAACE,WAAW,EAAE;IAE/D,OAAO,IAAI,CAACjE,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbuC,OAAO,EAAE,OAAO;MAChBC,QAAQ,EAAE,sBAAsB;MAChCyB,EAAE,EAAE;QAACH,IAAI,EAAJA;MAAI;IACX,CAAC,CAAC,CAACrD,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEkD,IAAI,gBAACvD,KAAK,EAAgB;IAAA,IAAduC,OAAO,uEAAG,CAAC,CAAC;IACtB,IAAMC,aAAa,GAAGxC,KAAK,CAACwC,aAAa,IAAID,OAAO,CAACC,aAAa;IAElE,IAAI,CAACA,aAAa,EAAE;MAClB,MAAM,IAAI9C,KAAK,CAAC,0DAA0D,CAAC;IAC7E;IAEA,OACE,IAAI,CAACO,OAAO,CAAC;MACXC,MAAM,EAAE,MAAM;MACdC,GAAG,YAAKH,KAAK,CAACI,GAAG,iBAAc;MAC/BC,IAAI,EAAE;QACJmC,aAAa,EAAbA,aAAa;QACblC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzCuC,WAAW,EAAE,CACX;UACEC,QAAQ,EAAE,wBAAe;YACvBC,IAAI,EAAE,KAAK;YACXC,GAAG,EAAEP,OAAO,CAACK;UACf,CAAC;QACH,CAAC,CACF;QACDlC,QAAQ,EAAEV,KAAK,CAACU,QAAQ,IAAI;UAC1BO,OAAO,EAAE,EAAE;UACXE,UAAU,EAAE,CAAC;UACbC,QAAQ,EAAE;QACZ;MACF;IACF,CAAC;IACC;IAAA,CACCT,IAAI,CAAC,UAACC,GAAG,EAAK;MACbA,GAAG,CAACP,IAAI,CAACL,KAAK,CAAC+C,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,UAACC,IAAI,EAAEC,KAAK,EAAK;QAC/CD,IAAI,CAACE,gBAAgB,GAAG,CAACxC,GAAG,CAACP,IAAI,CAAC+C,gBAAgB,CAACD,KAAK,CAAC,CAAC;QAE1D,OAAOD,IAAI;MACb,CAAC,CAAC;MAEF,OAAOtC,GAAG,CAACP,IAAI,CAACL,KAAK;IACvB,CAAC,CAAC;EAER,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEoE,KAAK,iBAACpE,KAAK,EAAE;IAAA;IACX,OAAO,IAAI,CAACC,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbC,GAAG,YAAKH,KAAK,CAAC+C,IAAI,CAAC3C,GAAG,WAAQ;MAC9BC,IAAI,EAAE;QACJC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzCM,QAAQ,EAAEV,KAAK,CAACU;MAClB;IACF,CAAC,CAAC,CACCC,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI,CAACL,KAAK;IAAA,EAAC,CAC7ByD,KAAK,CAAC,UAACC,MAAM,EAAK;MACjB,IAAIA,MAAM,YAAYC,yBAAc,CAACC,QAAQ,EAAE;QAC7C,OAAO,MAAI,CAACC,GAAG,CAAC7D,KAAK,CAAC;MACxB;MAEA,OAAO,iBAAQ8D,MAAM,CAACJ,MAAM,CAAC;IAC/B,CAAC,CAAC;EACN,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEW,IAAI,kBAAG;IACL,OAAO,IAAI,CAACpE,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbuC,OAAO,EAAE,OAAO;MAChBC,QAAQ,EAAE;IACZ,CAAC,CAAC,CAAC/B,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI,CAACiE,IAAI;IAAA,EAAC;EACjC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,KAAK,iBAACzD,OAAO,EAAEC,QAAQ,EAAE;IACvB;IACA,IAAI,CAACA,QAAQ,CAACM,YAAY,EAAE;MAC1B,OAAON,QAAQ;IACjB;IAEA,IAAMyD,IAAI,GAAG,yBAAU1D,OAAO,CAAC;;IAE/B;IACA;IACA;IACA,mBAAYC,QAAQ,CAAC,CAAC0D,OAAO,CAAC,UAACC,GAAG,EAAK;MACrC,IAAIA,GAAG,KAAK,cAAc,IAAIA,GAAG,KAAK,cAAc,EAAE;QACpD;MACF;MAEAF,IAAI,CAACE,GAAG,CAAC,GAAG3D,QAAQ,CAAC2D,GAAG,CAAC,IAAIF,IAAI,CAACE,GAAG,CAAC;IACxC,CAAC,CAAC;;IAEF;IACA;;IAEA,IAAI3D,QAAQ,CAAC4D,YAAY,IAAI5D,QAAQ,CAAC4D,YAAY,CAACzD,MAAM,EAAE;MACzD,IAAM0D,QAAQ,GAAG,kBAAS;MAC1B,IAAMC,QAAQ,GAAG,kBAAS;MAE1B9D,QAAQ,CAAC4D,YAAY,CAACF,OAAO,CAAC,UAACK,CAAC,EAAK;QACnC,IAAIA,CAAC,CAACC,OAAO,EAAE;UACb;UACA;UACA;UACAH,QAAQ,CAACI,GAAG,CAACF,CAAC,CAAC1E,GAAG,CAAC;QACrB,CAAC,MAAM;UACL;UACA;UACAyE,QAAQ,CAACI,GAAG,CAACH,CAAC,CAAC1E,GAAG,EAAE0E,CAAC,CAAC;QACxB;MACF,CAAC,CAAC;;MAEF;MACA;MACA;MACA;MACA,IAAMH,YAAY,GAAGH,IAAI,CAACG,YAAY,CAACO,MAAM,CAAC,UAACC,GAAG,EAAEL,CAAC,EAAK;QACxD,IAAI,CAACF,QAAQ,CAACQ,GAAG,CAACN,CAAC,CAAC1E,GAAG,CAAC,EAAE;UACxB+E,GAAG,CAACL,CAAC,CAAC1E,GAAG,CAAC,GAAG0E,CAAC;QAChB;QAEA,OAAOK,GAAG;MACZ,CAAC,EAAE,CAAC,CAAC,CAAC;MAENN,QAAQ,CAACJ,OAAO,CAAC,UAACY,KAAK,EAAEX,GAAG,EAAK;QAC/BC,YAAY,CAACD,GAAG,CAAC,GAAGW,KAAK;MAC3B,CAAC,CAAC;MAEFb,IAAI,CAACG,YAAY,GAAG,qBAAcA,YAAY,CAAC;IACjD;IAEA,OAAOH,IAAI;EACb,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEc,iBAAiB,6BAACtF,KAAK,EAAEuF,KAAK,EAAE;IAC9B,OAAO,IAAI,CAAChF,KAAK,CACdN,OAAO,CAAC;MACPE,GAAG,EAAEoF,KAAK,CAACnF,GAAG;MACdF,MAAM,EAAE,KAAK;MACbG,IAAI,EAAE;QACJmF,KAAK,EAAE;UACLC,WAAW,EAAE;QACf;MACF;IACF,CAAC,CAAC,CACD9E,IAAI,CAAC;MAAA,IAAEN,IAAI,QAAJA,IAAI;MAAA,OAAMA,IAAI;IAAA,EAAC;EAC3B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEqF,iBAAiB,6BAAC1F,KAAK,EAAEuF,KAAK,EAAE;IAC9B,OAAO,IAAI,CAAChF,KAAK,CACdN,OAAO,CAAC;MACPE,GAAG,EAAEoF,KAAK,CAACnF,GAAG;MACdF,MAAM,EAAE,KAAK;MACbG,IAAI,EAAE;QACJmF,KAAK,EAAE;UACLG,WAAW,EAAE;YACXvF,GAAG,EAAEJ,KAAK,CAAC+C,IAAI,CAAC3C,GAAG;YACnB4C,OAAO,EAAE,CAAC;cAAC5C,GAAG,EAAE,IAAI,CAACG,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL;YAAG,CAAC;UACjD,CAAC;UACDqF,WAAW,EAAE;QACf;MACF;IACF,CAAC,CAAC,CACD9E,IAAI,CAAC;MAAA,IAAEN,IAAI,SAAJA,IAAI;MAAA,OAAMA,IAAI;IAAA,EAAC;EAC3B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEuF,QAAQ,oBAAC5F,KAAK,EAAE6F,KAAK,EAAE;IACrB,OAAO,IAAI,CAAC5F,OAAO,CAAC;MAClBC,MAAM,EAAE,MAAM;MACdC,GAAG,YAAKH,KAAK,CAAC+C,IAAI,CAAC3C,GAAG,cAAW;MACjCC,IAAI,EAAE;QACJC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzC0F,IAAI,EAAE;UACJtD,aAAa,EAAEuD,aAAI,CAACC,EAAE,EAAE;UACxBH,KAAK,EAALA;QACF;MACF;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEI,IAAI,gBAACjG,KAAK,EAAE;IACV,OACE,IAAI,CAACC,OAAO,CAAC;MACXC,MAAM,EAAE,KAAK;MACbC,GAAG,EAAEH,KAAK,CAACkG;IACb,CAAC;IACC;IACA;IAAA,CACCvF,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI,IAAI,CAAC,CAAC;IAAA,EAAC;EAEpC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE8F,WAAW,uBAACnG,KAAK,SAA0C;IAAA,IAAvC8C,GAAG,SAAHA,GAAG;MAAEsD,UAAU,SAAVA,UAAU;MAAEC,UAAU,SAAVA,UAAU;MAAEC,OAAO,SAAPA,OAAO;IACtD,IAAM1D,QAAQ,GAAG;MACfwD,UAAU,EAAVA,UAAU;MACVC,UAAU,EAAVA;IACF,CAAC;IAED,IAAIvD,GAAG,EAAE;MACPF,QAAQ,CAACC,IAAI,GAAG,KAAK;MACrBD,QAAQ,CAACE,GAAG,GAAGA,GAAG;IACpB;IAEA,OAAO,IAAI,CAAC7C,OAAO,CAAC;MAClBC,MAAM,EAAE,KAAK;MACbC,GAAG,YAAKH,KAAK,CAAC+C,IAAI,CAAC3C,GAAG,WAAQ;MAC9BC,IAAI,EAAE;QACJC,SAAS,EAAE,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL,GAAG;QACzCuC,WAAW,EAAE,CACX;UACEC,QAAQ,EAAE,wBAAeA,QAAQ,CAAC;UAClC0D,OAAO,EAAPA;QACF,CAAC,CACF;QACD5F,QAAQ,EAAEV,KAAK,CAACU;MAClB;IACF,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAACP,IAAI,CAACL,KAAK;IAAA,EAAC;EAClC,CAAC;EAAA;AACH,CAAC,CAAC;AAAC,eAEYL,KAAK;AAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/internal-plugin-locus",
3
- "version": "3.0.0-beta.2",
3
+ "version": "3.0.0-beta.21",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -20,11 +20,11 @@
20
20
  ]
21
21
  },
22
22
  "dependencies": {
23
- "@webex/internal-plugin-locus": "3.0.0-beta.2",
24
- "@webex/internal-plugin-mercury": "3.0.0-beta.2",
25
- "@webex/test-helper-chai": "3.0.0-beta.2",
26
- "@webex/test-helper-mock-webex": "3.0.0-beta.2",
27
- "@webex/webex-core": "3.0.0-beta.2",
23
+ "@webex/internal-plugin-locus": "3.0.0-beta.21",
24
+ "@webex/internal-plugin-mercury": "3.0.0-beta.21",
25
+ "@webex/test-helper-chai": "3.0.0-beta.21",
26
+ "@webex/test-helper-mock-webex": "3.0.0-beta.21",
27
+ "@webex/webex-core": "3.0.0-beta.21",
28
28
  "lodash": "^4.17.21",
29
29
  "uuid": "^3.3.2"
30
30
  }
package/src/event-keys.js CHANGED
@@ -19,7 +19,7 @@ export const locusEventKeys = [
19
19
  'locus.floor_released',
20
20
  'locus.space_users_modified',
21
21
  'locus.controls_updated',
22
- 'locus.participant_controls_updated'
22
+ 'locus.participant_controls_updated',
23
23
  ];
24
24
 
25
25
  export default locusEventKeys;
package/src/index.js CHANGED
@@ -11,12 +11,4 @@ registerInternalPlugin('locus', Locus);
11
11
 
12
12
  export default Locus;
13
13
  export {locusEventKeys as eventKeys} from './event-keys';
14
- export {
15
- USE_INCOMING,
16
- USE_CURRENT,
17
- EQUAL,
18
- FETCH,
19
- GREATER_THAN,
20
- LESS_THAN,
21
- DESYNC
22
- } from './locus';
14
+ export {USE_INCOMING, USE_CURRENT, EQUAL, FETCH, GREATER_THAN, LESS_THAN, DESYNC} from './locus';
package/src/locus.js CHANGED
@@ -54,13 +54,11 @@ const Locus = WebexPlugin.extend({
54
54
  uri: `${locus.url}/participant/alert`,
55
55
  body: {
56
56
  deviceUrl: this.webex.internal.device.url,
57
- sequence: locus.sequence
58
- }
59
- })
60
- .then((res) => res.body);
57
+ sequence: locus.sequence,
58
+ },
59
+ }).then((res) => res.body);
61
60
  },
62
61
 
63
-
64
62
  /**
65
63
  * Compares two loci to determine which one contains the most recent state
66
64
  * @instance
@@ -79,7 +77,11 @@ const Locus = WebexPlugin.extend({
79
77
  function isEmpty(locus) {
80
78
  const {sequence} = locus;
81
79
 
82
- return (!sequence.entries || !sequence.entries.length) && sequence.rangeStart === 0 && sequence.rangeEnd === 0;
80
+ return (
81
+ (!sequence.entries || !sequence.entries.length) &&
82
+ sequence.rangeStart === 0 &&
83
+ sequence.rangeEnd === 0
84
+ );
83
85
  }
84
86
 
85
87
  if (isEmpty(current) || isEmpty(incoming)) {
@@ -198,11 +200,17 @@ const Locus = WebexPlugin.extend({
198
200
  }
199
201
 
200
202
  if (!currentOnly.length && !incomingOnly.length) {
201
- if (current.rangeEnd - getCompareFirstValue(current) > incoming.rangeEnd - getCompareFirstValue(incoming)) {
203
+ if (
204
+ current.rangeEnd - getCompareFirstValue(current) >
205
+ incoming.rangeEnd - getCompareFirstValue(incoming)
206
+ ) {
202
207
  return GREATER_THAN;
203
208
  }
204
209
 
205
- if (current.rangeEnd - getCompareFirstValue(current) < incoming.rangeEnd - getCompareFirstValue(incoming)) {
210
+ if (
211
+ current.rangeEnd - getCompareFirstValue(current) <
212
+ incoming.rangeEnd - getCompareFirstValue(incoming)
213
+ ) {
206
214
  return LESS_THAN;
207
215
  }
208
216
 
@@ -257,39 +265,43 @@ const Locus = WebexPlugin.extend({
257
265
  throw new Error('options.correlationId is required');
258
266
  }
259
267
 
260
- return this.request({
261
- method: 'POST',
262
- service: 'locus',
263
- resource: 'loci/call',
264
- body: {
265
- correlationId,
266
- deviceUrl: this.webex.internal.device.url,
267
- invitee: {
268
- invitee
268
+ return (
269
+ this.request({
270
+ method: 'POST',
271
+ service: 'locus',
272
+ resource: 'loci/call',
273
+ body: {
274
+ correlationId,
275
+ deviceUrl: this.webex.internal.device.url,
276
+ invitee: {
277
+ invitee,
278
+ },
279
+ localMedias: [
280
+ {
281
+ localSdp: JSON.stringify({
282
+ type: 'SDP',
283
+ sdp: options.localSdp,
284
+ }),
285
+ },
286
+ ],
287
+ sequence: {
288
+ entries: [],
289
+ rangeStart: 0,
290
+ rangeEnd: 0,
291
+ },
269
292
  },
270
- localMedias: [{
271
- localSdp: JSON.stringify({
272
- type: 'SDP',
273
- sdp: options.localSdp
274
- })
275
- }],
276
- sequence: {
277
- entries: [],
278
- rangeStart: 0,
279
- rangeEnd: 0
280
- }
281
- }
282
- })
283
- // res.body.mediaConnections is deprecated so just return the locus
284
- .then((res) => {
285
- res.body.locus.self.devices.map((item, index) => {
286
- item.mediaConnections = [res.body.mediaConnections[index]];
287
-
288
- return item;
289
- });
290
-
291
- return res.body.locus;
292
- });
293
+ })
294
+ // res.body.mediaConnections is deprecated so just return the locus
295
+ .then((res) => {
296
+ res.body.locus.self.devices.map((item, index) => {
297
+ item.mediaConnections = [res.body.mediaConnections[index]];
298
+
299
+ return item;
300
+ });
301
+
302
+ return res.body.locus;
303
+ })
304
+ );
293
305
  },
294
306
 
295
307
  /**
@@ -323,8 +335,8 @@ const Locus = WebexPlugin.extend({
323
335
  uri: `${locus.url}/participant/decline`,
324
336
  body: {
325
337
  deviceUrl: this.webex.internal.device.url,
326
- sequence: locus.sequence
327
- }
338
+ sequence: locus.sequence,
339
+ },
328
340
  })
329
341
  .then((res) => res.body)
330
342
  .catch((reason) => {
@@ -346,9 +358,8 @@ const Locus = WebexPlugin.extend({
346
358
  get(locus) {
347
359
  return this.request({
348
360
  method: 'GET',
349
- uri: `${locus.url}`
350
- })
351
- .then((res) => res.body);
361
+ uri: `${locus.url}`,
362
+ }).then((res) => res.body);
352
363
  },
353
364
 
354
365
  /**
@@ -360,15 +371,14 @@ const Locus = WebexPlugin.extend({
360
371
  * @returns {Promise<Object>}
361
372
  */
362
373
  getCallHistory(options = {}) {
363
- const from = (new Date(options.from || Date.now())).toISOString();
374
+ const from = new Date(options.from || Date.now()).toISOString();
364
375
 
365
376
  return this.request({
366
377
  method: 'GET',
367
378
  service: 'janus',
368
379
  resource: 'history/userSessions',
369
- qs: {from}
370
- })
371
- .then((res) => res.body);
380
+ qs: {from},
381
+ }).then((res) => res.body);
372
382
  },
373
383
 
374
384
  /**
@@ -387,35 +397,39 @@ const Locus = WebexPlugin.extend({
387
397
  throw new Error('locus.correlationId or options.correlationId is required');
388
398
  }
389
399
 
390
- return this.request({
391
- method: 'POST',
392
- uri: `${locus.url}/participant`,
393
- body: {
394
- correlationId,
395
- deviceUrl: this.webex.internal.device.url,
396
- localMedias: [{
397
- localSdp: JSON.stringify({
398
- type: 'SDP',
399
- sdp: options.localSdp
400
- })
401
- }],
402
- sequence: locus.sequence || {
403
- entries: [],
404
- rangeStart: 0,
405
- rangeEnd: 0
406
- }
407
- }
408
- })
409
- // The mediaConnections object is deprecated, so just return the locus
410
- .then((res) => {
411
- res.body.locus.self.devices.map((item, index) => {
412
- item.mediaConnections = [res.body.mediaConnections[index]];
413
-
414
- return item;
415
- });
416
-
417
- return res.body.locus;
418
- });
400
+ return (
401
+ this.request({
402
+ method: 'POST',
403
+ uri: `${locus.url}/participant`,
404
+ body: {
405
+ correlationId,
406
+ deviceUrl: this.webex.internal.device.url,
407
+ localMedias: [
408
+ {
409
+ localSdp: JSON.stringify({
410
+ type: 'SDP',
411
+ sdp: options.localSdp,
412
+ }),
413
+ },
414
+ ],
415
+ sequence: locus.sequence || {
416
+ entries: [],
417
+ rangeStart: 0,
418
+ rangeEnd: 0,
419
+ },
420
+ },
421
+ })
422
+ // The mediaConnections object is deprecated, so just return the locus
423
+ .then((res) => {
424
+ res.body.locus.self.devices.map((item, index) => {
425
+ item.mediaConnections = [res.body.mediaConnections[index]];
426
+
427
+ return item;
428
+ });
429
+
430
+ return res.body.locus;
431
+ })
432
+ );
419
433
  },
420
434
 
421
435
  /**
@@ -431,8 +445,8 @@ const Locus = WebexPlugin.extend({
431
445
  uri: `${locus.self.url}/leave`,
432
446
  body: {
433
447
  deviceUrl: this.webex.internal.device.url,
434
- sequence: locus.sequence
435
- }
448
+ sequence: locus.sequence,
449
+ },
436
450
  })
437
451
  .then((res) => res.body.locus)
438
452
  .catch((reason) => {
@@ -454,9 +468,8 @@ const Locus = WebexPlugin.extend({
454
468
  return this.request({
455
469
  method: 'GET',
456
470
  service: 'locus',
457
- resource: 'loci'
458
- })
459
- .then((res) => res.body.loci);
471
+ resource: 'loci',
472
+ }).then((res) => res.body.loci);
460
473
  },
461
474
 
462
475
  /**
@@ -499,8 +512,7 @@ const Locus = WebexPlugin.extend({
499
512
  // attribute `removed=true` should be removed from the working copy's
500
513
  // "participants" collection.
501
514
  toRemove.add(p.url);
502
- }
503
- else {
515
+ } else {
504
516
  // Elements of the delta events "participants" list that are absent
505
517
  // from the local working copy should be added to that collection.
506
518
  toUpsert.set(p.url, p);
@@ -537,15 +549,16 @@ const Locus = WebexPlugin.extend({
537
549
  * @returns {Promise}
538
550
  */
539
551
  releaseFloorGrant(locus, share) {
540
- return this.webex.request({
541
- uri: share.url,
542
- method: 'PUT',
543
- body: {
544
- floor: {
545
- disposition: 'RELEASED'
546
- }
547
- }
548
- })
552
+ return this.webex
553
+ .request({
554
+ uri: share.url,
555
+ method: 'PUT',
556
+ body: {
557
+ floor: {
558
+ disposition: 'RELEASED',
559
+ },
560
+ },
561
+ })
549
562
  .then(({body}) => body);
550
563
  },
551
564
 
@@ -557,19 +570,20 @@ const Locus = WebexPlugin.extend({
557
570
  * @returns {Promise}
558
571
  */
559
572
  requestFloorGrant(locus, share) {
560
- return this.webex.request({
561
- uri: share.url,
562
- method: 'PUT',
563
- body: {
564
- floor: {
565
- beneficiary: {
566
- url: locus.self.url,
567
- devices: [{url: this.webex.internal.device.url}]
573
+ return this.webex
574
+ .request({
575
+ uri: share.url,
576
+ method: 'PUT',
577
+ body: {
578
+ floor: {
579
+ beneficiary: {
580
+ url: locus.self.url,
581
+ devices: [{url: this.webex.internal.device.url}],
582
+ },
583
+ disposition: 'GRANTED',
568
584
  },
569
- disposition: 'GRANTED'
570
- }
571
- }
572
- })
585
+ },
586
+ })
573
587
  .then(({body}) => body);
574
588
  },
575
589
 
@@ -589,9 +603,9 @@ const Locus = WebexPlugin.extend({
589
603
  deviceUrl: this.webex.internal.device.url,
590
604
  dtmf: {
591
605
  correlationId: uuid.v4(),
592
- tones
593
- }
594
- }
606
+ tones,
607
+ },
608
+ },
595
609
  });
596
610
  },
597
611
 
@@ -603,13 +617,15 @@ const Locus = WebexPlugin.extend({
603
617
  * @returns {Types~LocusDelta}
604
618
  */
605
619
  sync(locus) {
606
- return this.request({
607
- method: 'GET',
608
- uri: locus.syncUrl
609
- })
610
- // the api may return a 204 no content, so we'll give back an empty
611
- // object in that case.
612
- .then((res) => res.body || {});
620
+ return (
621
+ this.request({
622
+ method: 'GET',
623
+ uri: locus.syncUrl,
624
+ })
625
+ // the api may return a 204 no content, so we'll give back an empty
626
+ // object in that case.
627
+ .then((res) => res.body || {})
628
+ );
613
629
  },
614
630
 
615
631
  /**
@@ -625,12 +641,10 @@ const Locus = WebexPlugin.extend({
625
641
  * @param {Boolean} options.videoMuted
626
642
  * @returns {Promise<Types~Locus>}
627
643
  */
628
- updateMedia(locus, {
629
- sdp, audioMuted, videoMuted, mediaId
630
- }) {
644
+ updateMedia(locus, {sdp, audioMuted, videoMuted, mediaId}) {
631
645
  const localSdp = {
632
646
  audioMuted,
633
- videoMuted
647
+ videoMuted,
634
648
  };
635
649
 
636
650
  if (sdp) {
@@ -643,15 +657,16 @@ const Locus = WebexPlugin.extend({
643
657
  uri: `${locus.self.url}/media`,
644
658
  body: {
645
659
  deviceUrl: this.webex.internal.device.url,
646
- localMedias: [{
647
- localSdp: JSON.stringify(localSdp),
648
- mediaId
649
- }],
650
- sequence: locus.sequence
651
- }
652
- })
653
- .then((res) => res.body.locus);
654
- }
660
+ localMedias: [
661
+ {
662
+ localSdp: JSON.stringify(localSdp),
663
+ mediaId,
664
+ },
665
+ ],
666
+ sequence: locus.sequence,
667
+ },
668
+ }).then((res) => res.body.locus);
669
+ },
655
670
  });
656
671
 
657
672
  export default Locus;